package com.wechat.developer.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

/**
 * 请求校验工具类(单例)
 *
 * @author Shemg
 * @date 2016/09/01
 */
public class WeChatSignUtil {
	
	private static Logger logger = LoggerFactory.getLogger(WeChatSignUtil.class);
	
	private WeChatSignUtil() {}
	
	private static class SignUtilManageHolder {
		private static WeChatSignUtil instance = new WeChatSignUtil();
	}
	
	public static WeChatSignUtil getInstance() {
		return SignUtilManageHolder.instance;
	}
  
    public static boolean checkSignature(String signature, String timestamp, String nonce , String token) {
    	logger.info(new StringBuffer("微信验证签名：[signature:").append(signature)
				.append("][timestamp:").append(timestamp).append("][nonce:").append(nonce)
				.append("][token:").append(token).append("]").toString());
        String[] arr = new String[] { token, timestamp, nonce };
        Arrays.sort(arr);
        StringBuilder content = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {  
            content.append(arr[i]);  
        }  
        MessageDigest md = null;
        String tmpStr = null;
        try {  
            md = MessageDigest.getInstance("SHA-1");
            byte[] digest = md.digest(content.toString().getBytes());  
            tmpStr = byteToStr(digest);  
        } catch (NoSuchAlgorithmException e) {
        	logger.error(e.getMessage());
        }  
  
        content = null;  
        boolean result = tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
        logger.info(new StringBuffer("微信验证签名，结果：").append(result).toString());
        return result;  
    }  
  
    /** 
     * 将字节数组转换为十六进制字符串 
     *  
     * @param byteArray 
     * @return 
     */  
    private static String byteToStr(byte[] byteArray) {
        String strDigest = "";
        for (int i = 0; i < byteArray.length; i++) {  
            strDigest += byteToHexStr(byteArray[i]);  
        }  
        return strDigest;  
    }  
  
    /** 
     * 将字节转换为十六进制字符串 
     *  
     * @param mByte 
     * @return 
     */  
    private static String byteToHexStr(byte mByte) {
        char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };  
        char[] tempArr = new char[2];  
        tempArr[0] = Digit[(mByte >>> 4) & 0X0F];  
        tempArr[1] = Digit[mByte & 0X0F];  
  
        String s = new String(tempArr);
        return s;  
    }
}
